# -*- coding: utf-8 -*-

"""
    http://projecteuler.net/problem=8
    
    Find the greatest product of five consecutive digits in the 1000-digit
    number.

73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
"""
#
# Import
#
import time
import re


#
# Globals / Constants
#
THE_NUMBER = """
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
"""

def timeit(f):
    def timer():
        t0 = time.time()
        returned = f()
        print "time %s: %.6f" % (f, time.time() - t0)
        return returned
    return timer

def assert_match(value, expected):
    assert value == expected, "value %s != expected %s" % (
        value, expected)


#
# Test Case / Solution
#
@timeit    
def test_case():
    pass

@timeit
def solution():
    seq_len = 5
    digit_string = stitch_multiline_digit(THE_NUMBER)
    
    max_seq = 0
    
    for seq in yield_digit_seqs(digit_string, seq_len):
        if len(seq) != seq_len:
            pass
        product_seq = get_sequence_product(seq)
        max_seq = max([product_seq, max_seq])
        
    return max_seq


#
# Support Code
#
def stitch_multiline_digit(multiline_digit_str):
    re_stitcher = re.compile('\s+')
    return re_stitcher.sub('', multiline_digit_str)
    
    
def yield_digit_seqs(digit_string, seq_len):
    index = 0
    while index < len(digit_string):
        yield digit_string[index:index+seq_len]
        index += 1

def get_sequence_product(digit_str):
    digits = [int(s) for s in list(digit_str)]
    return sequence_product(digits)
    
def sequence_product(seqs):
    product = 1
    for n in seqs:
        product *= n
    return product

#
# Test Code
#
def test_stitch_multiline_digit():
    multiline_str = """
123
45
 678  
"""
    stitched = stitch_multiline_digit(multiline_str)
    assert_match(stitched, '12345678')
    print "test_stitch_multiline_digit passed"
    
def test_yield_digit_seqs():
    s = '12345678901'
    expected = ['123', '234', '345', '456', '567', '678', '789', '890',
        '901', '01', '1']
    seqs = list(yield_digit_seqs(s, 3))
    assert_match(seqs, expected)
    print "test_yield_digit_seqs passed"
    
def test_get_sequence_product():
    s = '1234'
    expected = 2 * 3 * 4
    product = get_sequence_product(s)
    assert_match(product, expected)
    print "test_get_sequence_product passed"


#
# Main
#
if __name__ == '__main__':
    test_stitch_multiline_digit()
    test_yield_digit_seqs()
    test_get_sequence_product()
    test_case()
    print solution()
    